package com.rem.rabbitmq.ee.Ddurable;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.MessageProperties;
import com.rem.rabbitmq.ee.RabbitMqUtils;

import java.util.Scanner;


/**
 * 队列持久化  重启mq服务队列依旧存在
 * <p>
 * <p>
 * 如果队列已经持久化 再次创建就会报error
 * channel error; protocol method: #method<channel.close>(reply-code=406,
 * reply-text=PRECONDITION_FAILED - inequivalent arg 'durable' for queue 'QUEUE_ACK' in vhost '/': received 'true' but current is 'false', class-id=50, method-id=10)
 *
 * @author Rem
 * @date 2021-12-23
 */

public class DurableProducer {

    public static void main(String[] args) throws Exception {
        Channel channel = RabbitMqUtils.getChannel();

        /**
         *创建队列
         *
         *queue 队列名称
         *durable 队列里的消息是否持久化 (服务重启是否存在) 默认在内存中，  true 持久化
         *exclusive 如果我们声明一个独占队列（仅限于此连接），则为 true
         *autoDelete 如果我们声明一个自动删除队列，则为 true（服务器将在不再使用时将其删除）
         *arguments 队列的其他属性（构造参数）
         */
        channel.queueDeclare(RabbitMqUtils.QUEUE_DURABLE, true, false, false, null);

        System.err.println("开始发送消息...");
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String message = scanner.next();

            /**
             *发送消息
             *
             *exchange 发送到哪个交换机 默认交换机 用空表示
             *routingKey 路由键
             *props 消息的其他属性 -路由标头等
             *
             *MessageProperties.PERSISTENT_TEXT_PLAIN: 消息持久化
             *
             *
             *message 消息内容
             */
            channel.basicPublish("", RabbitMqUtils.QUEUE_DURABLE, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
            System.err.println("发送消息完毕" + message);
        }
    }
}
